<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
</head>

<body>
  <!-- 
      new 实现
      首先创一个新的空对象。
      根据原型链，设置空对象的 __proto__ 为构造函数的 prototype 。
      构造函数的 this 指向这个对象，执行构造函数的代码（为这个新对象添加属性）。
      判断函数的返回值类型，如果是引用类型，就返回这个引用类型的对象。
     -->
  <script>
    function _new(target) {
      let o = Object.create(target.prototype)
      let result = target.apply(o, ...arguments)
      if(result && typeof result === 'object') {
        return result
      }
      return o
    }
    function myNew(target) {
      if(typeof target !== 'function') throw new Error('类型错误')
      let obj = Object.create(target.prototype);
      let res = target.apply(obj, [...arguments].slice(1));
      if (res === null) return obj;
      return ['object', 'function'].includes(typeof res) ? res : obj

    }
    function Person(c) {
      this.a = "1213";
      this.age = 21;
      return {}
    }
    // let p = new Person("sd");
    // console.log(222, p);
    const cc = myNew(Person, "kjgdsd")
    console.log(cc);

    const list = [
      { id: 1, parentId: 0 },
      { id: 2, parentId: 1 },
      { id: 3, parentId: 1 },
      { id: 4, parentId: 2 },
      { id: 5, parentId: 4 }
    ]

    const map = {}
    list.forEach(item => {
      if (!map[item.id]) map[item.id] = []
      if (item.parentId) map[item.parentId].push(item)
    })

    const tree = map[0] 
    console.log(map);
  </script>
</body>

</html>